package de.hdu.pms.dao;

import java.util.List;

import org.apache.log4j.Logger;
import org.junit.Test;

import de.hdu.pms.model.Basis;
import de.hdu.pms.model.Mitarbeiter;

public class MitarbeiterDaoTest extends AbstractDataAccessTest {

	public static Logger Log = Logger.getLogger(BasisDaoTest.class);

	public static void setLog(Logger log) {
		Log = log;
	}

	private MitarbeiterDao mitarbeiterDao = null;
	private BasisDao basisDao = null;
	private String tableName = "mitarbeiter";
	private String tableBasis = "basis";

	public void setMitarbeiterDao(MitarbeiterDao mitarbeiterDao) {
		this.mitarbeiterDao = mitarbeiterDao;
	}

	public void setBasisDao(BasisDao basisDao) {
		this.basisDao = basisDao;
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testFindById() {
		Log.info("UnitTest - Mitarbeiter - FindById");
		String[] tables = { tableName };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		Basis basis = new Basis();
		basis.setBasis_bez("test");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		List<Mitarbeiter> alleMitarbeiter = mitarbeiterDao.findAll();
		for (Mitarbeiter m : alleMitarbeiter) {
			int id = m.getId();
			Mitarbeiter found = mitarbeiterDao.findById(id);
			assertEquals(m.getMit_name(), found.getMit_name());
			assertEquals(m.getMit_vorname(), found.getMit_vorname());
			assertEquals(m.getMit_login(), found.getMit_login());
			assertEquals(m.getMit_pw(), m.getMit_pw());
		}
		deleteFromTables(tables);
		deleteFromTables(tbasis);
	}

	@Test
	public void testFindAll() {
		Log.info("UnitTest - Mitarbeiter - FindAll");
		// Wurde bereits in testFindById() getestet
		testFindById();
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testSave() {
		Log.info("UnitTest - Mitarbeiter - Save");
		String[] tables = { tableName };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		Basis basis = new Basis();
		basis.setBasis_bez("save");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		int rows = countRowsInTable(tableName);
		assertEquals("Es darf nur eine Zeile vorhanden sein", 1, rows);

		deleteFromTables(tables);
		deleteFromTables(tbasis);
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testIsAdmin() {
		Log.info("UnitTest - Mitarbeiter - IsAdmin");
		String[] tables = { tableName };
		String[] tbasis = { tableBasis };
		deleteFromTables(tables);
		Basis basis = new Basis();
		basis.setBasis_bez("save");
		basisDao.save(basis);
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter.setMit_name("Mustermann");
		mitarbeiter.setMit_vorname("Max");
		mitarbeiter.setMit_login("mm");
		mitarbeiter.setMit_pw("123");
		mitarbeiter.setMit_isadmin(true);
		mitarbeiterDao.save(mitarbeiter, basis.getId());
		try {
			int isAdmin = mitarbeiterDao.isAdmin();
			assertEquals(1, isAdmin);
		} catch (Exception e) {
			Log.info("Exception: " + e.getMessage());
		}
		deleteFromTables(tables);
		deleteFromTables(tbasis);

	}

}
